//
//  ViewController.m
//  socket
//
//  Created by Sizhu Ba on 2017/8/30.
//  Copyright © 2017年 Sizhu Ba. All rights reserved.
//

#import "ViewController.h"
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //1.创建socket
    //第一个参数是 domain协议簇 Ipv4
    
    //第二个参数 type socket 的类型 流式(SOCK_STREAM) socket(SOCK_DGRAM)数据报  socket
    
    
    //第三个参数 protocol 协议
    
    //返回值 如果创建成功返回的是socket的描述符 失败-1
    
    int  clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //socket的描述符
    
    //2 连接服务器
    
    //第一个参数 socket的描述符
    
    //第二个参数 结构体 IP地址和短裤
    
    //第三个参数  结构体的长度 sizeof
    
    //返回值 成功0 失败非0
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr("192.168.2.112");//ip地址
    addr.sin_port = htons(1227);
    int result = connect(clientSocket, (const struct sockaddr *)&addr, sizeof(addr));
    
    if(result!=0){
        NSLog(@"%@", @"失败");
        return;
    }
    //3 向服务发送数据
    
    //const void *发送的数据
    
    //size_t 发送数据的大小 (字符个数)
    
    //int 是阻塞 一般是0
    const char *msg = "hello world";
   ssize_t sendCount = send(clientSocket, msg, strlen(msg), 0); //失败返回-1 成功返回字节数
    
    NSLog(@"发送的字节数%zd",sendCount);
    
    
    //4 接收服务器返回的数据
    
    //返回的是实际接受的字节个数
    //第一个参数int socket的描述符
    //第二个参数 void * 就是返回的数据存放的位置
    //第四个参数 int是否阻塞 0
    uint8_t buffer[1024];
    ssize_t recvCount = recv(clientSocket, buffer, sizeof(buffer), 0);
    NSLog(@"接收的字节数%zd",recvCount);
    
    //把字节数组转换位字符串
    NSData *data = [NSData dataWithBytes:buffer length:recvCount];
    NSString *recvMsg = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    
    NSLog(@"接受的的字符串%@",recvMsg);
    
    
    //5 关闭连接
    close(clientSocket);
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end
